precision highp float;
uniform sampler2D Sampler;
varying highp vec2 textureCoordinate;
const highp vec3 W = vec3(0.114,0.587,0.299);
const highp vec2 singleStepOffset = vec2(0.002079, 0.0015625);

//1.0, 1.0, 0.15, 0.15
//0.8, 0.9, 0.2, 0.2
//0.6, 0.8, 0.25, 0.25
//0.4, 0.7, 0.38, 0.3
//0.33/1.5, 0.63/1.5, 0.4/1.5, 0.35/1.5
const highp vec4 params = vec4(1.0, 1.1, 0.15, 0.15);
const mat3 saturateMatrix = mat3(
                                 1.1772,-0.0598,-0.0228,
                                 -0.1186,1.0826,-0.0774,
                                 -0.061,-0.0228,1.1102);

float hardlight(float color)
{
    if(color <= 0.5)
    {
        color = color * color * 2.0;
    }
    else
    {
        color = 1.0 - ((1.0 - color)*(1.0 - color) * 2.0);
    }
    return color;
}

float hardlight2(float color, float alpha)
{
    if(color <= 0.5)
    {
        color = pow(0.5, 1.0-alpha)*pow(color, alpha);
    }
    else
    {
        color = 1.0 - pow(0.5, 1.0-alpha)*pow(1.0-color, alpha);
    }
    return color;
}

void main(){
    vec2 blurCoordinates[24];

    blurCoordinates[0] = textureCoordinate.xy + singleStepOffset * vec2(0.0, -10.0);
    blurCoordinates[1] = textureCoordinate.xy + singleStepOffset * vec2(0.0, 10.0);
    blurCoordinates[2] = textureCoordinate.xy + singleStepOffset * vec2(-10.0, 0.0);
    blurCoordinates[3] = textureCoordinate.xy + singleStepOffset * vec2(10.0, 0.0);

    blurCoordinates[4] = textureCoordinate.xy + singleStepOffset * vec2(5.0, -8.0);
    blurCoordinates[5] = textureCoordinate.xy + singleStepOffset * vec2(5.0, 8.0);
    blurCoordinates[6] = textureCoordinate.xy + singleStepOffset * vec2(-5.0, 8.0);
    blurCoordinates[7] = textureCoordinate.xy + singleStepOffset * vec2(-5.0, -8.0);

    blurCoordinates[8] = textureCoordinate.xy + singleStepOffset * vec2(8.0, -5.0);
    blurCoordinates[9] = textureCoordinate.xy + singleStepOffset * vec2(8.0, 5.0);
    blurCoordinates[10] = textureCoordinate.xy + singleStepOffset * vec2(-8.0, 5.0);
    blurCoordinates[11] = textureCoordinate.xy + singleStepOffset * vec2(-8.0, -5.0);

    blurCoordinates[12] = textureCoordinate.xy + singleStepOffset * vec2(0.0, -6.0);
    blurCoordinates[13] = textureCoordinate.xy + singleStepOffset * vec2(0.0, 6.0);
    blurCoordinates[14] = textureCoordinate.xy + singleStepOffset * vec2(6.0, 0.0);
    blurCoordinates[15] = textureCoordinate.xy + singleStepOffset * vec2(-6.0, 0.0);

    blurCoordinates[16] = textureCoordinate.xy + singleStepOffset * vec2(-4.0, -4.0);
    blurCoordinates[17] = textureCoordinate.xy + singleStepOffset * vec2(-4.0, 4.0);
    blurCoordinates[18] = textureCoordinate.xy + singleStepOffset * vec2(4.0, -4.0);
    blurCoordinates[19] = textureCoordinate.xy + singleStepOffset * vec2(4.0, 4.0);

    blurCoordinates[20] = textureCoordinate.xy + singleStepOffset * vec2(-2.0, -2.0);
    blurCoordinates[21] = textureCoordinate.xy + singleStepOffset * vec2(-2.0, 2.0);
    blurCoordinates[22] = textureCoordinate.xy + singleStepOffset * vec2(2.0, -2.0);
    blurCoordinates[23] = textureCoordinate.xy + singleStepOffset * vec2(2.0, 2.0);

    float sampleColor = texture2D(Sampler, textureCoordinate).g * 22.0;
    sampleColor += texture2D(Sampler, blurCoordinates[0]).g;
    sampleColor += texture2D(Sampler, blurCoordinates[1]).g;
    sampleColor += texture2D(Sampler, blurCoordinates[2]).g;
    sampleColor += texture2D(Sampler, blurCoordinates[3]).g;
    sampleColor += texture2D(Sampler, blurCoordinates[4]).g;
    sampleColor += texture2D(Sampler, blurCoordinates[5]).g;
    sampleColor += texture2D(Sampler, blurCoordinates[6]).g;
    sampleColor += texture2D(Sampler, blurCoordinates[7]).g;
    sampleColor += texture2D(Sampler, blurCoordinates[8]).g;
    sampleColor += texture2D(Sampler, blurCoordinates[9]).g;
    sampleColor += texture2D(Sampler, blurCoordinates[10]).g;
    sampleColor += texture2D(Sampler, blurCoordinates[11]).g;

    sampleColor += texture2D(Sampler, blurCoordinates[12]).g * 2.0;
    sampleColor += texture2D(Sampler, blurCoordinates[13]).g * 2.0;
    sampleColor += texture2D(Sampler, blurCoordinates[14]).g * 2.0;
    sampleColor += texture2D(Sampler, blurCoordinates[15]).g * 2.0;
    sampleColor += texture2D(Sampler, blurCoordinates[16]).g * 2.0;
    sampleColor += texture2D(Sampler, blurCoordinates[17]).g * 2.0;
    sampleColor += texture2D(Sampler, blurCoordinates[18]).g * 2.0;
    sampleColor += texture2D(Sampler, blurCoordinates[19]).g * 2.0;
 
    sampleColor += texture2D(Sampler, blurCoordinates[20]).g * 3.0;
    sampleColor += texture2D(Sampler, blurCoordinates[21]).g * 3.0;
    sampleColor += texture2D(Sampler, blurCoordinates[22]).g * 3.0;
    sampleColor += texture2D(Sampler, blurCoordinates[23]).g * 3.0;

    sampleColor = sampleColor / 62.0;

    vec3 centralColor = texture2D(Sampler, textureCoordinate).bgr;

    float highpass = centralColor.g - sampleColor + 0.5;

    for(int i = 0; i < 5;i++)
    {
        highpass = hardlight(highpass);
    }
    float lumance = dot(centralColor, W);

    float alpha = pow(lumance, params.r);

    vec3 smoothColor = centralColor + (centralColor-vec3(highpass))*alpha*0.1;

    smoothColor.r = clamp(pow(smoothColor.r, params.g),0.0,1.0);
    smoothColor.g = clamp(pow(smoothColor.g, params.g),0.0,1.0);
    smoothColor.b = clamp(pow(smoothColor.b, params.g),0.0,1.0);

    vec3 lvse = vec3(1.0)-(vec3(1.0)-smoothColor)*(vec3(1.0)-centralColor);
    vec3 bianliang = max(smoothColor, centralColor);
    vec3 rouguang = 2.0*centralColor*smoothColor + centralColor*centralColor - 2.0*centralColor*centralColor*smoothColor;

    gl_FragColor = vec4(mix(centralColor, lvse, alpha), 1.0);
    gl_FragColor.rgb = mix(gl_FragColor.rgb, bianliang, alpha);
    gl_FragColor.rgb = mix(gl_FragColor.rgb, rouguang, params.b);

//    vec3 satcolor = gl_FragColor.rgb * saturateMatrix;
//    gl_FragColor.rgb = mix(gl_FragColor.rgb, satcolor, params.a);

//    gl_FragColor.rgb = clamp(pow(gl_FragColor.rgb, vec3(0.6)), 0.0, 1.0);
//    gl_FragColor.r = hardlight2(gl_FragColor.r, 1.5);
//    gl_FragColor.g = hardlight2(gl_FragColor.g, 1.5);
//    gl_FragColor.b = hardlight2(gl_FragColor.b, 1.5);
//    gl_FragColor = clamp(gl_FragColor, 0.0, 1.0);
    
}
